package com.yanjiali.config.mybatisplus;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator;
import com.baomidou.mybatisplus.extension.incrementer.H2KeyGenerator;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Package: com.yanjiali.com.yanjiali.config.mybatisplus
 * @Author: yanjiali
 * @Created: 2024/6/15 10:00
 * MP的配置类
 */
@Configuration
@MapperScan("com.yanjiali.mapper")
public class MybatisPlusConfig {

    /**
     * 分页插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        paginationInterceptor.setDbType(DbType.MYSQL);
        return paginationInterceptor;
    }


    /**
     * 乐观锁 (删除使用)
     * 通过 @Version 注解即可使用
     * 低冲突假设：大多数情况下，数据的并发修改是很少发生的。换句话说，大部分操作都是读操作，写操作较为稀少。
     * 无需加锁：在操作数据时，不需要通过加锁来防止其他事务修改数据，而是在提交时通过检测数据是否被修改来决定操作是否成功。
     */
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        OptimisticLockerInterceptor optimisticLockerInterceptor = new OptimisticLockerInterceptor();
        return optimisticLockerInterceptor;
    }


    /**
     * 这里 Id 生成器 --> 特殊的一些类使用
     * 一般：
     *  ID_WORK 数字
     *  ID_WORK_STR 字符串
     * @return
     */
    @Bean
    public IKeyGenerator iKeyGenerator(){
        H2KeyGenerator h2KeyGenerator = new H2KeyGenerator();
        return h2KeyGenerator;
    }
}
